package Demo;

import java.util.LinkedList;
import java.util.Queue;

//用队列模拟实现栈(需要使用到两个队列)
public class MyStack {
    Queue <Integer> qu1;
    Queue <Integer> qu2;
    public MyStack(){
        qu1=new LinkedList<>();
        qu2=new LinkedList<>();
    }
    //入栈->如果两个队列都为空，我们把数据指定放在qu1里面，其他情况，一律把数据放在不为空的队列里面
    public void push(int x){
        if (!qu1.isEmpty()){
            qu1.offer(x);
        }
        else if(!qu2.isEmpty()){
            qu2.offer(x);
        }
        else {
            qu1.offer(x);
        }
    }
    //出栈->如果两个队列都为空，则出不了元素，其他情况，我们把不为空的队列里面size-1个数据放入为空的队列里面去，剩下的那个就是我们要出的元素
    public int pop() {
        if (Empty()) {
            return -1;
        }
        if (!qu1.isEmpty()) {
            int size = qu1.size();
            while (size - 1 != 0) {
                int val = qu1.poll();
                qu2.offer(val);
                size--;
            }
            return qu1.poll();
        } else
         {
                int size = qu2.size();
                while (size - 1 != 0) {
                    int val = qu2.poll();
                    qu1.offer(val);
                    size--;
                }
                return qu2.poll();
            }

        }
//和pop()方法类似，区别在于把size个元素放入为空的队列里面去，每次放之前都把数据存在val变量里面，返回最后val里面的值即可
    public int top(){
        if (Empty()) {
            return -1;
        }
        if (!qu1.isEmpty()) {
            int size = qu1.size();
            int val=-1;
            while (size  != 0) {
                 val = qu1.poll();
                qu2.offer(val);
                size--;
            }
            return val;
        } else
        {
            int size = qu2.size();
            int val=-1;
            while (size != 0) {
               val = qu2.poll();
                qu1.offer(val);
                size--;
            }
            return val;
        }

    }
    //两队列都为空，才能说是真空
    public boolean Empty(){
        return qu1.isEmpty()&&qu2.isEmpty();
    }
}
